class Socket {
    /**
     * @description: 初始化实例属性，保存参数
     * 
     */
    constructor(options) {
        this.url = options.url;
        this.callback = options.received;
        this.name = options.name || 'default';
        this.ws = null;
        this.status = null;
        this.pingInterval = null;
        this.reconnectionNum=0
        // 心跳检测频率
        this._timeout = 3000;
        this.isHeart = options.isHeart;
        this.isReconnection = options.isReconnection;
    }
    connect(data) {
        this.ws = new WebSocket(this.url);
        // 建立连接
        this.ws.onopen = (e) => {
            this.status = 'open';
            this.reconnectionNum++
            console.log("连接成功", e)
            if (this.isHeart) {
                // 检测心跳
                this._heartCheck()
            }
            // 给后台发送数据
            const msg = data || { message: '建立连接' }
            return this.ws.send(JSON.stringify(msg))
        }
        // 接受服务器返回的信息
        this.ws.onmessage = (e) => {
            if (typeof this.callback === 'function') {
                // console.log('接收消息');
                return this.callback(e.data)
            } else {
                console.log('参数的类型必须为函数')
            }
        }
        // 关闭连接
        this.ws.onclose = (e) => {
            return new Promise(resolve=>{
                if(this.status=='close'){
                    console.log('onclose', e)
                    this._closeSocket(e)
                    resolve()
                }else{
                    resolve()
                }
            })
        }
        // 报错
        this.onerror = (e) => {
            console.log('onerror', e)
            this._closeSocket(e)
        }
    }
    sendMsg(data) {
        let msg = JSON.stringify(data)
        return this.ws.send(msg)
    }
    _resetHeart() {
        clearInterval(this.pingInterval)
        return this
    }
    _heartCheck() {
        this.pingInterval = setInterval(() => {
            if (this.ws.readyState === 1) {
                this.ws.send(JSON.stringify({ type: 'ping' }))
            }
        }, this._timeout)
    }
    _closeSocket(e) {
        this._resetHeart()
        if (this.status !== 'close') {
            console.log('断开，重连', e)
            //重连10次
            if (this.isReconnection) {
                if(this.reconnectionNum<10){
                     // 重连
                    this.connect()
                }  
            }
        } else {
            console.log('手动关闭了', e)
        }
    }
    //手动关闭
    async close() {
        this.status = 'close'
        this._resetHeart()
        await this.ws.close()
    }
}
/**
  * @description: 创建实例 方法
  * @params ：options对象
  * options包含{url：链接 必传,  received:接收服务器消息回调函数 必传,  name: 名称,  isHeart: 是否心跳,  isReconnection:是否断开重连 }
  */
const createSocket = (options) => {
    return new Socket(options)
}
export default createSocket